/*Copyright (C) 2009 - 2011 Careil Baptiste

This program is free software; you can redistribute it and/or
modify it under the terms of the GNU Lesser General Public
License as published by the Free Software Foundation; either
version 2.1 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Lesser General Public License for more details.

You should have received a copy of the GNU Lesser General Public
License along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef TYPES_PILES_HEADER
#define TYPES_PILES_HEADER

/*
** Valeur prédéfinie indiquant que la pile est vide.
** Utilisé à l'initialisation.
*/
#define EMPTY_STACK 0

/*
** Définition de la structure de la pile
**
** Utilisé en interne seulement.
*/

struct Pile {
	int data;

	struct Pile *previous;
};

/*
** Définition de l'objet Pile.
**
** Pour éviter d'éventuelle problème, il est conseillé d'initiailser
** une instance de pile comme suit: Pile maPile = STACK_EMPTY;
*/

typedef struct Pile *Pile;

/*
** Permet de remplir la pile.
**
** \parm pile La pile où ajouter les données.
** \parm data La données à insérer dans la pile.
** \return 0 en cas de succès, une autre valeur en cas d'échec
*/
int Pile_Push(Pile *pile, int data);

/*
** Permet de retirer un élément de la pile.
**
** \parm pile La pile où enlever l'élément.
** \return 0 en cas de succès, une autre valeur en cas d'échec
*/
int Pile_Pop(Pile *pile);

/*
** Permet de savoir si la pile est vide.
**
** \parm pile La pile à vérifier.
** \return 0 si la pile contient des élément, une autre valeur si elle
** n'en contient pas.
*/
int Pile_Empty(Pile pile);

/*
** Permet de connaitre la valeur de l'élément en tête de pile.
**
** \parm pile La pile à lire.
** \parm read Sera initialisé à la valeur stockée en tête de pile
** \return 0 en cas de succès, une autre valeur en cas d'échec.
*/
int Pile_Front(Pile pile, int *read);

/*
** Permet de vider la pile. Il est nécessaire d'appeler cette
** fonction à la fin du bloc d'instruction.
**
** \parm La pile à vider.
*/
void Pile_Clear(Pile *pile);

#endif
